package com.yzqp.generator.util;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.yzqp.generator.exception.GenerateException;
import lombok.Data;
import org.apache.commons.lang3.StringUtils;

/**
 * 参数map
 *
 * @author hejiacheng
 * @date 2021-12-4
 */
@Data
public class ParamMap {

    /**
     * JSONObject  阿里巴巴的fastJson 的内置对象 封装了hashmap
     */
    JSONObject jsonObject = null;

    public ParamMap(Object map) {
        if(map instanceof ParamMap){
            this.jsonObject = ((ParamMap)map).getJsonObject();
            return;
        }
        if(map instanceof  JSONObject){
            this.jsonObject = (JSONObject) map;
            return;
        }
        JSONObject jsonObject = (JSONObject) JSONObject.toJSON(map);
        this.jsonObject = jsonObject;
    }

    /**
     * 判断是否存在
     *
     * @param key
     * @return
     */
    private boolean exist(String key) {
        // 空值
        if (StringUtils.isEmpty(key)) {
            return false;
        }
        // 根据 "." 切割
        String[] keyArray = key.split("\\.");
        // 循环判断 是否存在key
        JSONObject jsonObj = this.jsonObject;
        for (int i = 0; i < keyArray.length; i++) {
            String keyItem = keyArray[i];
            // 判断是否存在
            if (!jsonObj.containsKey(keyItem)) {
                return false;
            }
            // 重新获取下一级 jsonObject   还没到最后一级的时候
            if (i < keyArray.length - 1) {
                // 获得下一级的值(JSONObject类型)
                try {
                    jsonObj = getNextJSONObject(jsonObj, keyItem);
                }catch (Exception e){
                    System.out.println(e);
                }
            }
        }
        return true;
    }

    /**
     * 判断是否存在
     *
     * @param key
     * @return
     */
    public String get(String key) {
        // 判断是否存在
        if (!this.exist(key)) {
            throw new GenerateException("找不到对应key的数据。key : " + key);
        }
        // 根据 "." 切割
        String[] keyArray = key.split("\\.");
        String res = "";
        // 循环判断 是否存在key
        JSONObject jsonObj = this.jsonObject;
        for (int i = 0; i < keyArray.length; i++) {
            String keyItem = keyArray[i];
            // 重新获取下一级 jsonObject
            if (i < keyArray.length - 1) {
                // 获得下一级的值(JSONObject类型)
                jsonObj = getNextJSONObject(jsonObj, keyItem);
            } else {
                // 最后一级 直接返回字符串
                res = jsonObj.getString(keyItem);
            }

        }
        return res;
    }

    /**
     * 获得下一级的JSONObject
     * @param jsonObj
     * @param keyItem
     * @return
     */
    private JSONObject getNextJSONObject(JSONObject jsonObj, String keyItem) {
        // 获得对应key 的 value
        Object object = jsonObj.get(keyItem);
        // 转化为 json字符串
        String jsonString = JSON.toJSONString(object);
        // 把json字符串 转化为 JSONObject
        jsonObj = JSON.parseObject(jsonString);
        return jsonObj;
    }

    /**
     * 添加 新的项
     * @param key
     * @param object
     */
    public void put(String key, Object object){
        this.jsonObject.put(key, object);
    }


    /**
     * 克隆对象
     * @return
     */
    public ParamMap cloneObject(){
        ParamMap newParamMap = new ParamMap(this.jsonObject.getInnerMap());

        return newParamMap;
    }
}
